Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
C# 无法将Linq转换为SQL_C#_Linq_Linq To Sql - Fatal编程技术网

C# 无法将Linq转换为SQL

C# 无法将Linq转换为SQL,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,因此,对于我得到的赋值,我必须将通过API获得的数据转换为对象,并将该对象保存在数据库中。因为对象没有唯一的属性,所以我的数据库中有多个主键列 所以我基本上要做的是将数据从“合并”到我的数据库,所以如果数据已更改为更新,如果数据是新的,则执行插入。出于某种原因,我的linq对此的查询给出了一个错误 我的数据库: 我的代码: public void Insert(List<MEDSU1> medsu1s) { var keys = medsu

因此,对于我得到的赋值,我必须将通过API获得的数据转换为对象,并将该对象保存在数据库中。因为对象没有唯一的属性,所以我的数据库中有多个主键列

所以我基本上要做的是将数据从“合并”到我的数据库,所以如果数据已更改为更新,如果数据是新的,则执行插入。出于某种原因,我的linq对此的查询给出了一个错误

我的数据库:

我的代码:

 public void Insert(List<MEDSU1> medsu1s)
        {
            var keys = medsu1s.Select(y => new { SUPP = y.S1SUPP?.Trim() ?? null, COMP = y.S1COMP?.Trim() ??null }).ToList();
            List<MEDSU1> medusFromSql = MediusDataContext.MEDSU1s.Where(y =>
                keys.Any(z => z.SUPP == y.S1SUPP && z.COMP == y.S1COMP)).ToList();


            var toUpdate = from medsu1org in MediusDataContext.MEDSU1s 


                join sqlkeys in medusFromSql
                    on new
                    {
                        aa = medsu1org.S1COMP,
                        bb = medsu1org.S1SUPP
                    }
                    equals
                    new
                    {
                        aa = sqlkeys.S1COMP,
                        bb = sqlkeys.S1SUPP
                    } 
                select new
                {
                    sql = medsu1org,
                    obj = sqlkeys,
                };



            toUpdate.ToList().ForEach(y =>
                        {
                            y.obj.S1COMP= y.sql.S1COMP;
                            y.obj.S1SUPP = y.sql.S1SUPP;
                            y.obj.S1SUNA = y.sql.S1SUNA;
                            y.obj.S1BAAC = y.sql.S1BAAC;
                            y.obj.S1VATN = y.sql.S1VATN;
                            y.obj.S1COUN = y.sql.S1COUN;
                            y.obj.S1PREF = y.sql.S1PREF;
                            y.obj.S1TAXD = y.sql.S1TAXD;
                            y.obj.S1CURR = y.sql.S1CURR;
                            y.obj.S1TYPE = y.sql.S1TYPE;
                            y.obj.S1ACNR = y.sql.S1ACNR;
                            y.obj.S1ACNM = y.sql.S1ACNM;
                            y.obj.S1EINV = y.sql.S1EINV;
                            y.obj.S1DLAY = y.sql.S1DLAY;
                            y.obj.S1TERM = y.sql.S1TERM;
                            y.obj.S1PYEE = y.sql.S1PYEE;
                        });
            var toInsert = medsu1s.Except(toUpdate.Select(y => y.obj)).ToList();
            MediusDataContext.MEDSU1s.InsertAllOnSubmit(toInsert);
            MediusDataContext.SubmitChanges();
}
公共作废插入(列表MEDSU1)
{
var keys=medsu1s.选择(y=>new{SUPP=y.S1SUPP?.Trim()??null,COMP=y.S1COMP?.Trim()??null}).ToList();
列出medusFromSql=MediusDataContext.MEDSU1s.Where(y=>
key.Any(z=>z.SUPP==y.S1SUPP&&z.COMP==y.S1COMP)).ToList();
var toUpdate=来自MediusDataContext.MEDSU1s中的medsu1org
在medusFromSql中连接sqlkeys
在纽约
{
aa=medsu1org.S1COMP,
bb=medsu1org.S1SUPP
}
等于
新的
{
aa=sqlkeys.S1COMP,
bb=sqlkeys.S1SUPP
} 
选择新的
{
sql=medsu1org,
obj=sqlkeys,
};
toUpdate.ToList().ForEach(y=>
{
y、 对象S1COMP=y.sql.S1COMP;
y、 obj.S1SUPP=y.sql.S1SUPP;
y、 obj.S1SUNA=y.sql.S1SUNA;
y、 obj.S1BAAC=y.sql.S1BAAC;
y、 obj.S1VATN=y.sql.S1VATN;
y、 obj.s1conn=y.sql.s1conn;
y、 obj.S1PREF=y.sql.S1PREF;
y、 obj.S1TAXD=y.sql.S1TAXD;
y、 obj.S1CURR=y.sql.S1CURR;
y、 obj.S1TYPE=y.sql.S1TYPE;
y、 obj.S1ACNR=y.sql.S1ACNR;
y、 obj.S1ACNM=y.sql.S1ACNM;
y、 obj.S1EINV=y.sql.S1EINV;
y、 obj.S1DLAY=y.sql.S1DLAY;
y、 obj.S1TERM=y.sql.S1TERM;
y、 obj.S1PYEE=y.sql.S1PYEE;
});
var toInsert=medsu1s.Except(toUpdate.Select(y=>y.obj)).ToList();
MediusDataContext.MEDSU1s.InsertAllOnSubmit(toInsert);
MediusDataContext.SubmitChanges();
}
代码中给出错误的部分是:

   var keys = medsu1s.Select(y => new { SUPP = y.S1SUPP?.Trim() ?? null, COMP = y.S1COMP?.Trim() ??null }).ToList();
   List<MEDSU1> medusFromSql = MediusDataContext.MEDSU1s.Where(y =>
                        keys.Any(z => z.SUPP == y.S1SUPP && z.COMP == y.S1COMP)).ToList();
var keys=medsu1s.Select(y=>new{SUPP=y.S1SUPP?.Trim()?null,COMP=y.S1COMP?.Trim()?null}).ToList();
列出medusFromSql=MediusDataContext.MEDSU1s.Where(y=>
key.Any(z=>z.SUPP==y.S1SUPP&&z.COMP==y.S1COMP)).ToList();
我想这与我使用了。任何错误的,并将其转换为一个列表,但我不知道如何修复它。有人能解释一下我做错了什么吗


获取时出错:“除了Contains运算符外,查询运算符的LINQ到SQL实现中不能使用本地序列。”

因为您处理的是复合键,所以您必须创建一个基本上如下所示的查询

Select *
From MEDSU1s
Where (S1SUPP == @S1SUPP1 && S1COMP == @S1COMP1)
    OR (S1SUPP == @S1SUPP2 && S1COMP == @S1COMP2)
    OR ....
要使用Linq实现这一点,您必须按程序构建表达式。请注意,我假设列都是字符串,所以根据需要更改它们的类型。我也没有很好的方法来测试,但希望这能让你开始寻找解决方案

var queryableData = MediusDataContext.MEDSU1s;

var table = Expression.Parameter(typeof(MEDSU1s), "x");

var suppCol = Expression.Property(table, typeof(string), "S1SUPP");
var compCol = Expression.Property(table, typeof(string), "S1COMP");

Expression condition = Expression.Equal(Expression.Constant(1), Expression.Constant(0));
foreach (var x in keys)
{
    var key1 = Expression.Equal(suppCol, Expression.Constant(x.SUPP));
    var key2 = Expression.Equal(compCol, Expression.Constant(x.COMP));
    var both = Expression.AndAlso(key1, key2);
    condition = Expression.OrElse(condition, both);
}

var whereExpression = Expression.Call(
    typeof(Queryable),
    "Where",
    new Type[] { queryableData.ElementType },
    queryableData.Expression,
    Expression.Lambda<Func<MEDSU1s, bool>>(
        condition, 
        new ParameterExpression[] { table }));

var medusFromSql = queryableData.Provider.CreateQuery<MEDSU1s>(whereExpression).ToList();
var queryableData=MediusDataContext.MEDSU1s;
var table=表达式参数(typeof(MEDSU1s),“x”);
var suppCol=Expression.Property(表,typeof(字符串),“S1SUPP”);
var compCol=Expression.Property(表,typeof(字符串),“S1COMP”);
表达式条件=表达式.Equal(表达式.常量(1),表达式.常量(0));
foreach(键中的变量x)
{
var key1=表达式.Equal(suppCol,表达式.Constant(x.SUPP));
var key2=表达式.Equal(compCol,表达式.Constant(x.COMP));
var ALTH=表达式AndAlso(键1,键2);
条件=表达式.OrElse(条件,两者);
}
var whereExpression=Expression.Call(
类型(可查询),
“哪里”,
新类型[]{queryableData.ElementType},
queryableData.Expression,
Lambda(
条件
新参数表达式[]{table});
var medusFromSql=queryableData.Provider.CreateQuery(whereExpression.ToList();

阅读并包含错误以及您对问题的研究。
出于某种原因,我的一位linq对此提出了疑问,但给出了错误。
关于错误的任何线索?将错误添加到帖子中。很抱歉完全忘记了以下内容:列出medusFromSql=MediusDataContext.MEDSU1s.Where(y=>keys.Any(z=>z.SUPP==y.S1SUPP&&z.COMP==y.S1COMP))。选择(x=>new MEDSU1(){在这里添加类属性S1COMP=x.Field(“S1COMP”)})。ToList()<代码>??null有点毫无意义,因为它的字面意思是“如果为null,则替换为null”。您的SQL示例只是重复了两次相同的条件?此技术是否可以使用最大数量的参数?@NetMage是的,修复了这个问题。@mjwills Well SQL Server的参数限制为2100。