gpt4 book ai didi

c# - 使用对象列表连接表

转载 作者:行者123 更新时间:2023-11-30 17:00:28 25 4
gpt4 key购买 nike

我有一个表,假设 tblCar 包含所有相关的列,如 Id、Make、Model、Color 等。

我有一个包含两个参数 Id 和 Model 的汽车搜索模型。

public class CarSearch
{
public int Id { get; set; }
public string Model { get; set; }
}

var carSearchObjets = new List<CarSearch>();

使用原始数据列表(如 Id 列表),要获得具有这些 ID 的汽车,我可以这样做:

var idList = new List<int> { 1, 2, 3 };
var carsFromQuery = context.Cars.Where(x => idList.Contains(x.Id);

但是如果我必须从列表中获取所有具有 Id 和型号的汽车,我该怎么做呢?无法在内存对象和表之间进行简单连接。

我需要类似的东西,

from m in context.Cars
join n in carSearchObjets
on new { Id = n.Id, Model = n.Model } equals new { Id = m.Id, Model = m.Model }
select m;

这显然行不通。

请忽略任何拼写错误。如果您需要更多信息或问题不清楚,请告诉我。

最佳答案

一种(丑陋但有效的)管理方法是使用“从未使用过”的连接字符进行连接。

我的意思是一个永远不应该出现在数据中的字符。这总是很危险的,因为......永远都不确定,但你已经明白了。

例如,我们会说我们“从未使用过”的连接字符将是 ~

这对性能不好,但至少可以工作:

var carSearchObjectsConcatenated = carSearchObjets.Select(m => new { m.Id + "~" + m.Model});

然后您可以再次使用 Contains(也在数据库上连接):如果您想在数据库上连接字符串和数字,则需要使用 SqlFunctions.StringConvert边。

var result = context.Cars.Where(m => 
carSearchObjectsConcatenated.Contains(SqlFunctions.StringConvert((double)m.Id) + "~" + m.Model);

编辑

另一种解决方案是使用 PredicateBuilder,如 Sorax 所提到的,或者如果您不想要第三方库,则构建您自己的 Filter 方法(但 PredicateBuilder 确实很好)。

静态类中的类似内容:

public static IQueryable<Car> FilterCars(this IQueryable<Car> cars, IEnumerable<SearchCar> searchCars)
{
var parameter = Expression.Parameter(typeof (Car), "m");

var idExpression = Expression.Property(parameter, "Id");
var modelExpression = Expression.Property(parameter, "Model");

Expression body = null;
foreach (var search in searchCars)
{
var idConstant = Expression.Constant(search.Id);
var modelConstant = Expression.Constant(search.Model);

Expression innerExpression = Expression.AndAlso(Expression.Equal(idExpression, idConstant), Expression.Equal(modelExpression, modelConstant));
body = body == null
? innerExpression
: Expression.OrElse(body, innerExpression);
}
var lambda = Expression.Lambda<Func<Car, bool>>(body, new[] {parameter});
return cars.Where(lambda);
}

用法

var result = context.Cars.FilterCars(carSearchObjets);

这将生成一个类似的 sql

select ...
from Car
where
(Id = 1 And Model = "ax") or
(Id = 2 And Model = "az") or
(Id = 3 And Model = "ft")

关于c# - 使用对象列表连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22177549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com