Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写一个方法来同时为SQL和数组构建查询?_Sql_Linq_Object - Fatal编程技术网

如何编写一个方法来同时为SQL和数组构建查询?

如何编写一个方法来同时为SQL和数组构建查询?,sql,linq,object,Sql,Linq,Object,我有一个动态生成查询的方法BuildQuery。它适用于SQL: static MyType[] GetDataFromDB(MyDataContext db, string city, string district, string region, string country, string zip) { var q = BuildQuery(db.MyTable.AsQueryable(), city, district, region, country,

我有一个动态生成查询的方法
BuildQuery
。它适用于SQL:

    static MyType[] GetDataFromDB(MyDataContext db, string city, string district, string region, string country, string zip)
    {
        var q = BuildQuery(db.MyTable.AsQueryable(), city, district, region, country, zip);
        return q.ToArray();
    }

    private static IQueryable<MyType> BuildQuery(IQueryable<MyType> q, string city, string district, string region, string country, string zip)
    {
        if (!string.IsNullOrEmpty(city))
            q = q.Where(p => p.City.Contains(city));
        if (!string.IsNullOrEmpty(district))
            q = q.Where(p => p.District.Contains(district));
        if (!string.IsNullOrEmpty(zip))
            q = q.Where(p => p.Zip == zip);
        if (!string.IsNullOrEmpty(region))
            q = q.Where(p => p.Region.Contains(region));
        if (!string.IsNullOrEmpty(country))
            q = q.Where(p => p.Country == country);
        return q;
    }
当然,这不会编译,因为
MyType[]
IEnumerable
,而不是
IQueryable
。将
BuildQuery
中第一个参数的类型更改为
IEnumerable
,编译数组并可用于数组,但不会生成SQL查询


我想我可以让BuildQuery成为一个通用的方法,但是怎么做呢?有什么好主意吗?

LINQ的一个优点是,您可以将函数相互连接(链接)。这是可能的,因为引入了扩展方法

如果稍微更改BuildQuery函数,可以将其用作任何LINQ函数。看

好吧,也许你应该给它取个恰当的名字:要不要查询一下

要执行查询,请执行您想对其执行的操作:
ToList
/
ToArray
/Count/FirstOrDefault/


顺便说一下,在创建类似LINQ的函数时,通常最好返回IEnumerable/IQueryable,而不是List/Array/etc,除非您确实知道调用者需要完整的序列。如果你调用
ToList()
,而你的调用者只想要
FirstOrDefault()

如果你用
传入你的数组,那将是一种浪费。AsQueryable()
可以吗?
    MyType[] SelectFromResult(MyType[] loc, string city, string district, string region, string country, string zip)
    {
        var q = BuildQuery(loc, city, district, region, country, zip);
        return q.ToArray();
    }
 private static IQueryable<MyType> BuildQuery(this IQueryable<MyType> q, 
     string city, string district, string region, string country, string zip)
{
    ...
MyType[] loc = ...
IQueryable<MyType> myQueryable = loc.AsQueryable()
                                    .BuildQuery(city, district, ....);