gpt4 book ai didi

c# - 在 LINQ to SQL 中,如何将 LINQ 查询的一部分传递给函数

转载 作者:太空狗 更新时间:2023-10-29 18:21:26 24 4
gpt4 key购买 nike

是否可以将 linq 查询的一部分传递给函数?我想为我的 DAL 创建一个始终使用相同查询接口(interface)的通用接口(interface)。例如,

List<T> Get(Join j, Where w, Select s){    
return currentDataContext<T>.Join(j).Where(w).Select(s).ToList();
}

这种事情有可能吗?我想这可以用表达式树来完成,但我没能找到它的例子。

最佳答案

好吧,“连接”很棘手,因为很难表达连接 - 但是像 where/select/orderby 这样的事情很容易...

实际上,这只是在 IQueryable<T> 上组合各种 LINQ 方法的情况。 ,一般接受 Expression<Func<...>>对于一些组合。因此,带有可选谓词的基本选择将是:

    public IQueryable<T> Get<T>(
Expression<Func<T,bool>> predicate
) where T : class
{
IQueryable<T> query = (IQueryable<T>)GetTable(typeof(T));
if (predicate != null) query = query.Where(predicate);
return query;
}

我倾向于返回 IQueryable<T>也是,因为它是完全可组合的。如果调用者想要一个列表,他们总是可以使用 ToList()在它上面......或者(例如):

    using(var ctx = new MyDataContext(CONN))
{
ctx.Log = Console.Out;
int frCount = ctx.Get<Customer>(c => c.Country == "France").Count();
}

哪个(使用 Northwind)执行查询:

SELECT COUNT(*) AS [value]
FROM [dbo].[Customers] AS [t0]
WHERE [t0].[Country] = @p0

在查询中包含“选择”(投影)的问题是您最终会得到多个通用类型。由于您通常希望投影是匿名类型,因此几乎不可能指定投影类型(匿名)表类型,并且它不可调用。

实际上,我想知道编写这样的方法是否有很多好处。我可能会坚持使用基本方法:

    public IQueryable<T> Get<T>() where T : class
{
return (IQueryable<T>)GetTable(typeof(T));
}

让调用者以他们喜欢的方式组合它——也许使用查询语法:

       var list = (from cust in ctx.Get<Customer>()
where cust.Country == "France"
select cust.CompanyName).Take(10).ToList();

使用:

SELECT TOP (10) [t0].[CompanyName]
FROM [dbo].[Customers] AS [t0]
WHERE [t0].[Country] = @p0

或者,如果您真的想包含排序依据和投影,那么扩展方法是最实用的方法;那么你不需要指定原始的(源)T(这使得它在与匿名类型混合时无法调用):

public static class QueryExtension
{
public static IQueryable<TProjection>
Get<TSource, TProjection, TOrderKey>(
this IQueryable<TSource> source,
Expression<Func<TSource, bool>> where, // optional
Expression<Func<TSource, TProjection>> select,
Expression<Func<TProjection, TOrderKey>> orderBy)
{
if (where != null) source = source.Where(where);
return source.Select(select).OrderBy(orderBy);
}
}

然后考虑一个 DAL 方法,例如:

    public List<string> Countries()
{
return Customers.Get(
x=>x.CompanyName != "",
x=>x.Country,
x=>x).Distinct().ToList();
}

它使用(再次使用 Northwind):

SELECT DISTINCT [t0].[Country]
FROM [dbo].[Customers] AS [t0]
WHERE [t0].[CompanyName] <> @p0

关于c# - 在 LINQ to SQL 中,如何将 LINQ 查询的一部分传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/434480/

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