Установить или обновить данные в LINQ - PullRequest
0 голосов
/ 26 августа 2011

через LINQ Я хочу сравнить идентификатор записи = идентификатор параметра тогда я хочу установить или обновить doc_id в той же записи. Я написал несколько строк здесь:

public void Fill_WF_Doc(string ID, int doc)
{
    DataClasses1DataContext DB = new DataClasses1DataContext();
    Waiting_Task entry = new Waiting_Task();
    var c = from D in DB.Waiting_Tasks
            where (D.WF_ID == ID)
            select D.Doc_ID;
    c = doc;
 }

но у меня была эта ошибка:

Невозможно неявно преобразовать тип 'int' в 'System.Linq.IQueryable'

Любая помощь? Спасибо.

Ответы [ 6 ]

1 голос
/ 26 августа 2011

Не вызывая GetEnumerator по вашему запросу, вы фактически ничего не извлекаете из базы данных.Оберните ваш запрос в () и используйте ToList(), First(), Single() или другие для вызова запроса.

Waiting_Task entry = (from D in DB.Waiting_Tasks
                      where (D.WF_ID == ID)
                      select D).FirstOrDefault();

Оттуда, только возвращая Id, вы собираетесь вернуть одинint, если вы хотите обновить вашу сущность, верните полный объект, используя select D

Я хочу установить или обновить doc_id в той же записи.

Оттуда вы можете просто обновить значение и SubmitChanges(), чтобы отправить обновленное значение обратно в базу данных.

public void Fill_WF_Doc(string ID, int doc)
{
  DataClasses1DataContext DB = new DataClasses1DataContext();
  Waiting_Task entry = (from D in DB.Waiting_Tasks
                        where (D.WF_ID == ID)
                        select D).FirstOrDefault();
  entry.Doc_ID = doc;

  DB.SubmitChanges();
}
0 голосов
/ 26 августа 2011

c возвращает (метод для получения) списка элементов, а не один элемент. Вам необходимо либо выполнить итерацию по набору результатов, и применить свои обновления, либо использовать один из методов Single / First, чтобы получить одно значение и обновить его, как указали другие.

Кроме того, если вы хотите обновить значение в объекте, вам необходимо спроецировать весь объект, а затем отредактировать значение, которое вы хотите обновить. При проецировании одного идентификатора остальная часть типа объекта теряется, и EF не знает, как выровнять ваше обновление с базовой строкой базы данных.

0 голосов
/ 26 августа 2011
DataClasses1DataContext DB = new DataClasses1DataContext();
var docs = from D in DB.Waiting_Tasks
           where (D.WF_ID == ID)
           select D; // select all the docs met the criteria

foreach(var D in docs)
{
    D.Doc_ID = doc;
}

или

просто

DataClasses1DataContext DB = new DataClasses1DataContext();
var docs = DB.Waiting_Tasks.Where(D => D.WF_ID == ID); // or FirstOrDefault() if ID is key or unique constraint
...
0 голосов
/ 26 августа 2011

Результатом операции select является IEnumerable<T>, в вашем случае IEnumerable<int>, поскольку Doc_ID имеет тип int.

Я бы сказал, что вы делаете это:

c.ToList().ForEach(e => e = doc);
0 голосов
/ 26 августа 2011
    // c is an IEQueryable<int>
    var c = from D in DB.Waiting_Tasks
            where (D.WF_ID == ID)
            select D.Doc_ID;
    // Error is here, you affect an int to an IQueryable<int>
    c = doc;

Что вы пытаетесь сделать?


РЕДАКТИРОВАТЬ

Чтобы обновить c.WF_ID, вы делаете:

var c = (from D in DB.Waiting_Tasks
        where (D.WF_ID == ID)
        select D.Doc_ID).FirstOrDefault();
if(c != null)
{
    c.WF_ID = doc;
}
0 голосов
/ 26 августа 2011

потому что ваше выражение LINQ возвращает IEnumerable из-за выбора.

строка, которая выдает исключение, показана ниже:

 public void Fill_WF_Doc(string ID, int doc)
    {
        DataClasses1DataContext DB = new DataClasses1DataContext();
        Waiting_Task entry = new Waiting_Task();
        var c = from D in DB.Waiting_Tasks
                where (D.WF_ID == ID)
                select D.Doc_ID;
        c = doc;//this throw an exception as doc is an Int but c is an ienumerable

     }
...