我正在寻找一些搜索例程使用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 的博客文章.这似乎做我想要的,但我的问题是:
提前致谢!
假设我有一个包含四列的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(双).
我遇到很多麻烦,有人可以解决这个问题吗?
我正在使用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)
在此表上,有一个密码列,我不想返回此列.
如何从该选择中排除密码列?
我正在创建一个新的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) 我正在寻找一种从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语句意味着对数据库有多个查询,我不想要
是否可以在 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
在我的应用程序中,某些表需要多个报告,许多字段在大多数报告中都很常见,作为示例:
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) 目前我们有一个包从字符串中的字段动态生成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) 我有一个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) 我有一个可以生成查询并将其导出到 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:我真的很感谢您的启发,也感谢您的宝贵时间。
是否可以选择事先未知列名称的实体的不同属性值 - 由方法作为来自客户端的字符串接收.
出于过滤目的,我想从浏览器向服务器发出HTTP POST Ajax请求,该请求将包含字段名称作为密钥,这将作为字符串提供给服务器.
我知道我将不得不手动映射ViewModel和Entity Framework使用的POCO类之间的任何差异,但是可以构造一个没有强类型属性的实体框架查询 - 例如使用反射.
我可能会尝试实现这一点,其中数据由控制器确定,调用基本存储库的泛型方法,实体类作为类型.这是可能的还是我需要为每个可能的字段构建一个方法?
同样,我应该尝试这样做,还是用字段作为参数构建ADO.NET SQL命令(从ViewModel映射到SQL列名称)?