相关疑难解决方法(0)

动态LINQ - 是否有.NET 4版本?

我正在寻找一些搜索例程使用LINQ,并希望有一些动态where子句.因此,例如,如果用户想要按城市搜索或按州搜索,我会有一个动态LINQ Where <>调用而不是创建两个强类型LINQ表达式,然后根据用户想要搜索的方式使用适当的LINQ表达式.

所以我想这样做:

String criteria="p.City='Pittsburgh'";  //or "p.State='PA'"
personData.Where(criteria)
Run Code Online (Sandbox Code Playgroud)

代替

personData.Where(p => p.City=="Pittsburgh");

要么

personData.Where(p => p.State=="PA");

我看到Scott Guthrie在Visual Studio 2008样本中谈论Dynamic LINQ 的博客文章.这似乎做我想要的,但我的问题是:

  1. 此示例库是否受Microsoft支持?
  2. Scott Guthrie的文章是关于VS2008(.NET 3.5)的..NET 4有更好的选择吗?也许用.NET 4发布的东西可以实现同样的东西(或者非常接近的东西)?

提前致谢!

c# linq dynamic-linq linq-expressions

31
推荐指数
3
解决办法
2万
查看次数

System.LINQ.Dynamic:选择("new(...)")到List <T>(或任何其他可枚举的<T>集合)

假设我有一个包含四列的DataTable,Company(字符串),Fund(字符串),State(字符串),Value(double):

    table1.Rows.Add("Company 1","Fund 1","NY",100));
    table1.Rows.Add("Company 2","Fund 1","CA",200));
    table1.Rows.Add("Company 3","Fund 1","FL",300));
    table1.Rows.Add("Company 4","Fund 2","CA",400));
    table1.Rows.Add("Company 5","Fund 1","NY",500));
    table1.Rows.Add("Company 6","Fund 2","CA",600));
    table1.Rows.Add("Company 7","Fund 3","FL",700));
Run Code Online (Sandbox Code Playgroud)

我想使用System.LINQ.Dynamic构建一个动态查询,该查询在公司,基金或州上分组,然后按条件选择我的组作为第一列,并且sum(value):

string groupbyvalue="Fund";
var q1= table1.AsEnumerable().AsQueryable()
              .GroupBy(groupbyvalue,"it")
              .Select("new ("+groupbyvalue+" as Group, Sum(Value) as TotalValue)");
Run Code Online (Sandbox Code Playgroud)

在上面的查询中,所选的groupbyvalue(Group)将始终是一个字符串,并且总和将始终为double,因此我希望能够转换为类似List的内容,其中Result是具有属性Group的对象(字符串) )和TotalValue(双).

我遇到很多麻烦,有人可以解决这个问题吗?

linq dynamic-linq

20
推荐指数
1
解决办法
4万
查看次数

使用LINQ从选择中排除列

我正在使用Entity Framework Code First开发WCF RESTful Web服务.

我有一张Users包含很多列的表格.我这样做是为了得到一个特定的用户:

context.Configuration.ProxyCreationEnabled = false;
var users = from u in context.Users
            where u.UserId == userId
            select u;
Run Code Online (Sandbox Code Playgroud)

在此表上,有一个密码列,我不想返回此列.

如何从该选择中排除密码列?

c# sql linq entity-framework

11
推荐指数
2
解决办法
2万
查看次数

Web Api用户过滤响应字段

我正在创建一个新的Web API,并希望允许用户指定在URL中返回哪些字段.

我目前的想法是:

对于这样的示例模型:

public class Value
{
    public string ValueId { get; set; }

    public int Number { get; set; }

    public ValueInternal Internal { get; set; }
}
public class ValueInternal
{
    public int Number { get; set; }

    public string Something { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和这样的URL

http://example.com/api/values/?_fields=Number,Internal(Something)
Run Code Online (Sandbox Code Playgroud)

会回来的

[
   {
       "Number": 0,
       "Internal": {
           "Number": 0
       }
   }
]
Run Code Online (Sandbox Code Playgroud)

我已经提出了以下实现这一目标的方法,但它有一些缺陷.即它是无法处理的,如果Internal是可枚举的ValueInternal或者不支持包括所有或包括所有除外,或者如果T和TResult是不同的类型.有没有人对我如何改进这一点有任何建议,或者是否已经存在一种我缺少的方法.

public static Expression<Func<T, TResult>> CreateSelector<T, TResult>() where TResult : new()
    {
        var …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-web-api

7
推荐指数
1
解决办法
985
查看次数

从linq到实体查询动态构建选择列表

我正在寻找一种从iQueryable对象动态创建选择列表的方法.

具体的例子,我想做类似以下的事情:

public void CreateSelectList(IQueryable(of EntityModel.Core.User entities), string[] columns)
{
    foreach(var columnID in columns)
    {
        switch(columnID)
        {
            case "Type":
                SelectList.add(e => e.UserType);
                break;
            case "Name":
                SelectList.add(e => e.Name);
                break;
            etc....
        }
    }
    var selectResult = (from u in entities select objSelectList);
}
Run Code Online (Sandbox Code Playgroud)

因此,所有属性都是已知的,但我事先并不知道要选择哪些属性.这将通过columns参数传递.

我知道我将遇到selectResult类型的问题,因为当选择列表是动态的时,编译器不知道匿名类型的属性需要是什么.

如果上述情况不可能:我需要它的场景如下:
我正在尝试创建一个可以实现的类来显示分页/过滤的数据列表.这些数据可以是任何东西(取决于实现).使用的linq是实体的linq.所以它们直接链接到sql数据.现在我只想选择我实际在列表中显示的实体的列.因此我希望select是动态的.我的实体可能有一百个属性,但如果列表中只显示了3个属性,我不想生成一个选择所有100列数据的查询,然后只使用其中的3个.如果有一种我没有想到的不同方法,我会接受各种想法

编辑:


关于约束的一些澄清:- 查询需要使用linq到实体(请参阅问题主题)
- 实体可能包含100列,因此选择所有列然后只读取我需要的列不是一个选项.
- 最终用户决定要显示哪些列,因此要选择的列在运行时确定
- 我需要创建一个SINGLE选择,有多个select语句意味着对数据库有多个查询,我不想要

c# linq linq-to-entities entity-framework

6
推荐指数
1
解决办法
5542
查看次数

用于包含列的 LINQ SELECT 中的 IF 语句

是否可以在 linq Select 中包含或排除列?

var numberOfYears = Common.Tool.NumberOfYear;
 var list = users.Select(item => new
        {
            Id = item.Id,
            Name= item.Name,
            City= Item.Address.City.Name,
            STATUS = Item.Status,
            if(numberOfYears == 1)
            {
               Y1 = item.Records.Y1,
            }
            if(numberOfYears == 2)
            {
               Y1 = item.Records.Y1,
               Y2 = item.Records.Y2,
            }
            if(numberOfYears == 3)
            {
               Y1 = item.Records.Y1,
               Y2 = item.Records.Y2,
               Y3 = item.Records.Y3,
            }
        }).ToList();
    }
Run Code Online (Sandbox Code Playgroud)

这个想法是我只想在有值时才显示 Y1,Y2,Y3

c# linq select properties dynamic

6
推荐指数
1
解决办法
2736
查看次数

实体框架中可重用的 linq 选择查询

在我的应用程序中,某些表需要多个报告,许多字段在大多数报告中都很常见,作为示例:

public class ReportStudent
{
    public int Id {get; set;}
    public string Name {get; set;}
    public string Family {get; set;}
    public DateTime BirthDate {get; set;}
    public DateTime RegisterDate {get; set;}
    public Double Average {get; set;}
    public string FatherName {get; set;}
    public string MotherName {get; set;}
}

var list1 = context.Students.Select(e=> new ReportStudent
{
    Id = e.Id
    Name = e.Name
    Family = e.Family
    BirthDate = e.BirthDate
    RegisterDate = e.RegisterDate
    FatherName = e.FatherName
    MotherName = e.MotherName
}).ToList();

var list2 = context.Students.Select(e=> new …
Run Code Online (Sandbox Code Playgroud)

c# linq entity-framework

5
推荐指数
1
解决办法
1344
查看次数

c# - 使用嵌套属性动态生成linq select

目前我们有一个包从字符串中的字段动态生成linq select.它适用于平面属性,但它不适用于像someObj.NestedObj.SomeField这样的嵌套字段.

我们当前的代码在服务方法中如下所示:

_context.Shipments
    .Where(s => s.Id == request.Id) // it does not matter just an example
    .Select(request.Fields)
    .ToPage(request); // ToPage extension comes from a nuget package
Run Code Online (Sandbox Code Playgroud)

请求对象的参数"fields"只是一个用逗号分隔的字符串,包括Shipment对象的属性.

我对Shipment进行了一些重构,我将一些字段分组为一个名为Address的新类,并将其添加到Shipment中,如下所示:

// before refactoring
class Shipment {
    // other fields...
    public string SenderAddress;
    public string SenderCityName;
    public string SenderCityId;

    public string RecipientAddress;
    public string CityName;
    public string CityId;
}

// after refactoring
class Shipment {
   // other fields...
   public Address Sender;
   public Address Recipient;
}

class Address {
    public string AddressText;
    public …
Run Code Online (Sandbox Code Playgroud)

c# linq select dynamic

5
推荐指数
1
解决办法
1454
查看次数

仅选择Linq(EF核心)的特定字段

我有一个DbContext地方,我想运行一个查询只返回特定列,以避免获取所有数据.
问题是我想用一组字符串指定列名,我想获得一个IQueryable原始类型,即不构造匿名类型.

这是一个例子:

// Install-Package Microsoft.AspNetCore.All
// Install-Package Microsoft.EntityFrameworkCore

using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;

public class Person {
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class TestContext : DbContext {
    public virtual DbSet<Person> Persons { get; set; }
    public TestContext(DbContextOptions<TestContext> options) : base(options) {
    }
}

class Program {
    static void Main(string[] args) {

        var builder = new DbContextOptionsBuilder<TestContext>(); …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework-core .net-core

5
推荐指数
1
解决办法
1102
查看次数

LINQ 根据 string[] 数组选择列

我有一个可以生成查询并将其导出到 Excel 的方法。我希望用户选择他们想要导出的列。

我的问题有点类似于这个 OP LINQ select property by name

我们可以在其中基于列表创建LINQ 选择查询string[] columns,它应该与下面的_dbcontext.Person.Select( SelectorFunc(columns) ).SomeOtherQuery().ToList(); 查询和函数有点相似SelectorFunc(columns)

public Func<Person, string[]> SelectorFunc(string[] columns) {
    //  ninja code!! 
   return " not sure here";
}
Run Code Online (Sandbox Code Playgroud)

如果我必须像这样手动完成它,那就有点混乱了。

var query = _dbcontext.Person.AsQueryable();

if(column == "ID") 
  query = query.Select( x=x.ID);
if(column == "Name") 
  query = query.Select( x=x.Name);

//and the list goes on...
Run Code Online (Sandbox Code Playgroud)

PS:我真的很感谢您的启发,也感谢您的宝贵时间。

c# linq

3
推荐指数
1
解决办法
3226
查看次数

根据字符串字段名称选择不同的实体值

是否可以选择事先未知列名称的实体的不同属性值 - 由方法作为来自客户端的字符串接收.

出于过滤目的,我想从浏览器向服务器发出HTTP POST Ajax请求,该请求将包含字段名称作为密钥,这将作为字符串提供给服务器.

我知道我将不得不手动映射ViewModel和Entity Framework使用的POCO类之间的任何差异,但是可以构造一个没有强类型属性的实体框架查询 - 例如使用反射.

我可能会尝试实现这一点,其中数据由控制器确定,调用基本存储库的泛型方法,实体类作为类型.这是可能的还是我需要为每个可能的字段构建一个方法?

同样,我应该尝试这样做,还是用字段作为参数构建ADO.NET SQL命令(从ViewModel映射到SQL列名称)?

c# linq entity-framework

1
推荐指数
1
解决办法
2337
查看次数