View Full Version : سوال: کار با RIA Services
newsoft
جمعه 21 بهمن 1390, 09:52 صبح
با سلام
یه پروژه ساده با سیلور لایت که می خواد با یه کوری ساده با دادن ایدی، نام طرف بگیره تو یه لیبل نشون بده
این کارهارو انجام دادم
یه پروژه ایجاد کردم از نوع سیلور لایت ria فعال کردم
entity data model رو هم اضافه کردم با عمل first database
domin service class اضافه کردم به model لینک دادم قسمت edit رو هم فعال کردم
تو قسمت سلور لایت یه data grid با دستور زیر پر می کنم
var nikdomincontext = new Nikamoz.Web.nikDomainContext();
dataGrid1.ItemsSource = nikdomincontext.Table1s;
nikdomincontext.Load(nikdomincontext.GetTable1Quer y());
تا حالا مشکلی نیست
ولی الان می خوام نام یه ایدی رو بخونم یه سرچ ساده
var b = (from o in nikdomincontext.Table1s where (o.id == 1) select o).First();
button1.Content = b.name;
این خطا رو میده
Sequence contains no elements
بعدش که میام تو دامین سرویس هم کد می زارمو فراخونی می کنم به شکل زیر
یه رکورد رو میده ولی نمی تونم فیلد هارو جدا کنم
public IQueryable<Table1> Getnamebyid(int id)
{
return this.ObjectContext.Table1.Where(
a => a.id == id);
}
الان اگه کد بالارو به دیتا گرید بدم یه رکورد میده ولی می خوام یه فیلدو به یه لیبل بدم
in_chand_nafar
جمعه 21 بهمن 1390, 11:31 صبح
در قسمت اول شما دیتا رو لود کردید و داخل گرید اضافه کردید.
در قسمت دوم دیتاهایی که به سمت کلاینت اومده رو دارید و حالا می خواهید یک رکورد از اون انتخاب کنید می توانید از این کد استفاده کنید
var id = 123;
var test= nikdomincontext..Table1s.Single(p => p.id == id);
button1.Content = test.name
و در قسما آخر که می گی کوئری میزنی و می خواهی یه رکورد بده دلیل اون این است که نوع بازگشتی شما از نوع IQueryable و این یعنی لیستی از داده ها برای اینکار در سمت کلاینت می توانی این کار را انجام بدی
var id = 123;
nikdomincontext.Load(nikdomincontext.GetnamebyidQu ery(id),(lo)=>
{
foreach(var item in nikdomincontext.Table1s)
{
button1.content=item.Name;
break;
}
},null);
در انتها باید بگم که در سیلورلایت هر چیزی که از سمت RIA Service می آید باید به شکل Asynch اجرا بشه
لازم می دونم اشاره کنم که چون سی شارپ دم دست نداشتم نمی تونم کدها رو تست کنم
موفق باشی
مسعود طاهری
newsoft
جمعه 21 بهمن 1390, 12:01 عصر
با تشکر از استاد خوبم
قسمت اول این کد نمی دونم چرا این خطا رو میده
var id = 1;
var test = nikdomincontext.Table1s.Single(p => p.id == id);
button1.Content = test.name;
خطا
Sequence contains no matching element
در صورتی که id تو دیتابیس هستش
یعنی تو گریدی که بهش وصل کردم نشون میده
در مورد کد دوم
اگه تابع ما از نوع بازگشتی int باشه سمت کلاینت چه جوری ازش استفاده می کنیم
با تشکر فراوان
in_chand_nafar
جمعه 21 بهمن 1390, 14:57 عصر
http://taswar.zeytinsoft.com/2010/03/26/linq-sequence-contains-no-matching-element/
var id = 1;
var test = nikdomincontext.Table1s.FirstOrDefault(p => p.id == id);
if (test!=null)
button1.Content = test.name;
البته در كد بالا فرض شده شما ديتاها را از قبل از سمت سرويس به كلاينت آوردي و حالا مي خواهي يه ركورد از اون را انتخاب كني
-------------------------
--سمت سرويس
[EnableClientAccess]
public class EmployeesService : DomainService
{
[Invoke]
public int CountEmployees()
{
return this.ObjectContext.Employees.Count();
}
}
توي سرويس به قسمت هايي كه Bold كردم توجه كن
--سمت كلاينت
EmployeesContext context = new EmployeesContext();
InvokeOperation<int> invokeOp = context.CountEmployees(OnInvokeCompleted, null);
private void OnInvokeCompleted(InvokeOperation<int> invOp)
{
if (invOp.HasError)
{
MessageBox.Show(string.Format("Method Failed: {0}", invOp.Error.Message));
invOp.MarkErrorAsHandled();
}
else
{
result = invokeOp.Value;
}
}
--قسمت Complete در حقيقت براي اين است كه متد به شكل Asynch فراخواني شده و در پايان بعد از اينكه نتيجه از سمت سرويس برگشت چه كاري انجام شود. اين ماهيت كار با RIAو برنامه هاي سيلورالايتي است
newsoft
جمعه 21 بهمن 1390, 16:28 عصر
آقای طاهری شما خودتون تو پروژه ها از همین روش استفاده می کنین؟؟
in_chand_nafar
جمعه 21 بهمن 1390, 17:22 عصر
ctxt.Load(ctxt.GetEmployeeByNumberQuery("ABC123")).Completed += new System.EventHandler(EmployeeLoad_Completed);
void EmployeeLoad_Completed(object sender, System.EventArgs e)
{
Employee myEmployee = (sender as LoadOperation<Employee>).Entities.FirstOrDefault();
}
بستگي به كارم داره
حالا نمي دونم كارتون راه افتاد يا خير
موفق باشيد
newsoft
جمعه 21 بهمن 1390, 18:38 عصر
فقط بگم خیلی خستم کرد
هم کار کردن با گرافیکش خیلی سخته یعنی باید از blend استفاده کنی
کدش که بدتر
باز هم از کمک شما متشکرم
ولی چون علاقه دارم برام مهم نیست
باز تلاش می کنم تا با فوت و فنش بیشتر آشنا بشم
قبلا asp.net کار می کردم خیلی راحتر از این بود
شاید هم بخاطر اینه که تازه باهاش آشنا شدم
و آموز های موجود خیلی کمه
کدهایی که شما اینجا گفتی من جایی ندیدم حتی تو سایت خودتون
in_chand_nafar
جمعه 21 بهمن 1390, 19:12 عصر
به نظر من كار كردن با ويژوال استوديو خيلي راحتر است اگر كار گرافيكي خيلي خفن مي كنيد برين سراغ Expression Blend وگرنه نيازي نيست
در ضمن در طراحي به راحتي مي توانيد از كدهاي XAML استفاده كنيد و سعي كنيد طراحي خود را با GRID و StackPanel و... انجام دهيد تا اونجايي كه مي تونيد اندازه و سايز كنترل هاي رو حذف كنيد و با گريد طراحي خودتون رو انجام بدهيد تا در هر رزولوشني برنامه درست نمايش داده شود
<Grid FlowDirection="RightToLeft">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="200" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Label Grid.Row="0"
Grid.Column="0"
Content="FirstName1"
HorizontalContentAlignment="Right"
Margin="5" />
<Label Grid.Row="1"
Content="FirstName2"
HorizontalContentAlignment="Right"
Margin="5"/>
<TextBox Name="txtFirstName1" Grid.Row="0"
Grid.Column="1"
Text="{Binding Person.FirstName}" Margin="5"/>
<TextBox Name="txtFirstName2"
Grid.Row="1"
Grid.Column="1" Margin="5"
Text="{Binding Path=Person.FirstName}"
/>
</Grid>
newsoft
جمعه 21 بهمن 1390, 19:46 عصر
خوب اگه قرار باشه گرافیکی نداشته باشه از asp.net استفاده می کنم
خیلی راحتتر
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.